package com.stack.knowyoudao.dao;

import com.stack.knowyoubean.bean.CourseAtlas;
import org.apache.ibatis.annotations.*;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 图谱持久层
 * mysql底层采用了utf-8mp4的排序规则所以检索时忽略英文字母大小写
 *
 * @author stack
 */
@Component
@Scope("singleton")
@CacheNamespace
public interface CourseAtlasDao {

    /**
     * 通过名称查找节点（判断节点是否存在）
     *
     * @param name 名称
     * @param sid  课程号
     * @return 节点
     */
    @Select("select * from atlasnode where name=#{name} and sid=#{sid}")
    CourseAtlas.Node findNodeByName(@Param("name") String name, @Param("sid") Integer sid);

    /**
     * 查询本课程所有节点集合
     *
     * @param sid 课程号
     * @return 节点集合
     */
    @Select("select * from atlasnode where sid=#{sid}")
    List<CourseAtlas.Node> findAllNode(Integer sid);

    /**
     * 查找相关边集或者全部边集
     *
     * @param source 节点编号
     * @param sid    课程号
     * @return 边集
     */
    @Select("<script>" +
            "select * from atlasedge where sid = #{sid} " +
            "<if test=\" source !=null and source !=0 \"> and source=#{source} </if> " +
            "</script>")
    List<CourseAtlas.Edge> findAtlasEdge(@Param("source") Integer source, @Param("sid") Integer sid);


    /**
     * 查找相关节点集合
     *
     * @param source 起始点
     * @param sid    课程号
     * @return 节点集合
     */
    @Select("<script>" +
            "select * from atlasnode where nodeid in (" +
            "select target from atlasedge where sid = #{sid} " +
            "<if test=\" source !=null and source !=0 \"> and source=#{source} </if> " + ")" +
            "</script>")
    List<CourseAtlas.Node> findAtlasNode(@Param("source") Integer source, @Param("sid") Integer sid);

    /**
     * 插入节点
     *
     * @param node 节点
     * @return 插入标记
     */
    @Insert("insert into atlasnode(sid,name,type,atlasnode.desc) values(#{sid},#{name},#{type},#{desc})")
    int insertNode(CourseAtlas.Node node);

    /**
     * 更新节点
     *
     * @param node 节点
     * @return 更新标记
     */
    @Update("update atlasnode set type=#{type},atlasnode.desc=#{desc} where name=#{name} and sid=#{sid}")
    int updateNode(CourseAtlas.Node node);

    /**
     * 删除节点
     *
     * @param node 节点
     * @return 删除标记
     */
    @Delete("delete from atlasnode where sid=#{sid} and name=#{name} ")
    int deleteNode(CourseAtlas.Node node);

    /**
     * 删除节点相关边
     *
     * @param node 节点
     * @return 删除边的条数
     */
    @Delete("delete from atlasedge where (source=#{nodeid} or target=#{nodeid}) and sid=#{sid}")
    int deleteNodeEdge(CourseAtlas.Node node);

    /**
     * 查询指定边（判断边存在）
     *
     * @param edge 边
     * @return 边实体
     */
    @Select("select * from atlasedge where source=#{source} and target=#{target} and sid=#{sid}")
    CourseAtlas.Edge findEdge(CourseAtlas.Edge edge);

    /**
     * 添加边
     *
     * @param edge 边
     * @return 添加标记
     */
    @Insert("insert into atlasedge(source,target,rela,sid) values(#{source},#{target},#{rela},#{sid})")
    int insertEdge(CourseAtlas.Edge edge);

    /**
     * 更新边
     *
     * @param edge 边
     * @return 更新标记
     */
    @Update("update atlasedge set rela=#{rela} where sid=#{sid} and source=#{source} and target=#{target}")
    int updateEdge(CourseAtlas.Edge edge);

    /**
     * 删除关联
     *
     * @param edge 边
     * @return 删除标记
     */
    @Delete("delete from atlasedge where sid=#{sid} and source=#{source} and target=#{target}")
    int deleteEdge(CourseAtlas.Edge edge);

}
